/* The file is saved in UTF-8 codepage.
 * Check: «Stereotype», Section mark-§, Copyright-©, Alpha-α, Beta-β, Smile-☺
 */
package cz.pecinovsky.english.lootp._134_;


import cz.pecinovsky.english.lootp._000_.Run;

//import cz.pecinovsky.english.lootp.správce.Position;
import cz.pecinovsky.english.lootp.manager.Mover;


import cz.pecinovsky.english.lootp.manager.CanvasManager_Envelope.               CanvasManager;
import cz.pecinovsky.english.lootp._134_.Car_134_.                               Car;
import cz.pecinovsky.english.lootp._134_.IModular_134_.                          IModular;
import cz.pecinovsky.english.lootp._134_.TestUtility_134_.                       TestUtility;


//import cz.pecinovsky.english.lootp._134_.CarTest_134_.                           CarTest;
////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ End of ignored starting test - place for imports +++++
//%I+ >=132z
//
//import cz.pecinovsky.english.lootp.canvasmanager.Mover;
//import cz.pecinovsky.english.lootp.canvasmanager.CanvasManager;
//%I-

import cz.pecinovsky.english.lootp.utility.NamedColor;
import cz.pecinovsky.english.lootp.utility.IO;
import cz.pecinovsky.english.lootp.utility.Position;

import java.util.ArrayList;
import java.util.List;
//%X+ xxxxx Start of the ovejumped text with declaration of the envelope xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class CarTest_134_
{    private CarTest_134_() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- End of the ovejumped text with declaration of the envelope -----


/*******************************************************************************
 * Testovací třída {@code CarTest}  slouží ke komplexnímu otestování
 * třídy {@link CarTest}.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class CarTest extends junit.framework.TestCase
{
    private CanvasManager CM;
    private Car car0;
    private Car carXY;
    private Car carXYB;
    private Car carXYM;
    private Car carXYMB;



//== CONSTANT CLASS ATTRIBUTES =================================================
//== VARIABLE CLASS ATTRIBUTES =================================================
//== STATIC CONSTRUCTOR (CLASS INITIALIZER, STATIC INICITALIZING BLOCK) ======== 
//== CONSTANT INSTANCE ATTRIBUTES ==============================================
//== VARIABLE INSTANCE ATTRIBUTES ==============================================
//== CLASS GETTERS AND SETTERS =================================================
//== OTHER NON-PRIVATE CLASS METHODS ===========================================

//##############################################################################
//== CONSTUCTORS AND FACTORY METHODS ===========================================

    /***************************************************************************
     * Vytvoří test se zadaným názvem.
     *
     * @param name  Název konstruovaného testu
     */
    public CarTest(String name)
    {
        super(name);
    }



//== PREPARATION AND CLEANING THE FIXTURE ======================================

    /***************************************************************************
     * Inicializace předcházející spuštění každého testu a připravující tzv.
     * přípravek (fixture), což je sada objektů, s nimiž budou testy pracovat.
     */
    @Override
    protected void setUp()
    {
        car0    = new Car();
        carXY   = new Car(50, 100);
        carXYB  = new Car(150,  25, NamedColor.BLACK);
        carXYM  = new Car(200, 100,  64);
        carXYMB = new Car( 0, 172, 256, NamedColor.RED);

        CM = CanvasManager.getInstance();
        CM.add(car0);
        CM.add(carXY);
        CM.add(carXYB);
        CM.add(carXYM);
        CM.add(carXYMB);

        System.out.println("\n====== Instance v přípravku pro " + this +
                           "\n| CM: " + CM +
                           "\n| car0:    " + car0 +
                           "\n| carXY:   " + carXY +
                           "\n| carXYB:  " + carXYB +
                           "\n| carXYM : " + carXYM +
                           "\n| carXYMB: " + carXYMB +
                           "\n======");
        IO.inform("Cars prepared");
    }


    /***************************************************************************
     * Úklid po testu - tato metoda se spustí po vykonání každého testu.
     */
    @Override
    protected void tearDown()
    {
    }


//== PRIVATE AND AUXILIARY CLASS METHODS =======================================
//== PRIVATE AND AUXILIARY INSTANCE METHODS ====================================

    /***************************************************************************
     * Vyzkouší blikání zadaného auta
     */
    private void auxBlink(Car car)
    {
        car.lightOff();
        IO.pause(500);
        car.blinkLeft();
        IO.pause(500);
        car.blinkRight();
        IO.pause(500);
        car.lightOn();
    }



//== EMBEDDED TYPES AND INNER CLASSES ==========================================
//== THE TESTS =================================================================
//
//     /***************************************************************************
//      *
//      */
//     public void testXXX()
//     {
//     }
//

    /***************************************************************************
     *
     */
    public void testBlink()
    {
        auxBlink(car0);
        auxBlink(carXY);
        auxBlink(carXYB);
        auxBlink(carXYM);
        auxBlink(carXYMB);
    }


    public void testSmoothMovement()
    {
        Mover p = new Mover(10);
        p.moveTo(150, 150, car0);
        p.moveTo( 0, 200, carXY);
        p.moveTo( 0,   0, carXYMB);
        p.moveTo(150, 236, carXYB);
        p.moveTo( 0, 150, carXYM);
    }


    public void testPositionSize()
    {
        TestUtility.setPositionModules(new Position(50, 200), 25, 200);
        TestUtility.positionSize(carXYMB);
        TestUtility.positionSize(carXYM);
        TestUtility.positionSize(carXYB);
        TestUtility.positionSize(carXY);
        TestUtility.positionSize(car0);
    }


    public void testSwapPositionsWithCheck()
    {
        TestUtility.swapPositionsWithCheck(car0,   carXYB);
        TestUtility.swapPositionsWithCheck(carXYB, carXYM);
        TestUtility.swapPositionsWithCheck(carXYM, carXYMB);
    }

//%A+ >136

    /***************************************************************************
     * Vyzkouší schopnosti auta při objíždění okruhů.
     */
    public void testMobility()
    {
        TestUtility.runRing(new Car());
    }

//%A-
//%A+ >142

    /***************************************************************************
     * Vyzkouší schopnosti komparátoru ve třídě {@link TestUtility}
     * při řazení aut.
     */
    public void testSortList()
    {
        List<IModular> seznam = new ArrayList<IModular>();
        seznam.add(car0);
        seznam.add(carXY);
        seznam.add(carXYB);
        seznam.add(carXYM);
        seznam.add(carXYMB);
        seznam.add(car0);
        TestUtility.seřaďSeznam(seznam);
    }

//%A-
//%X+
     /** */
     public void testFixture() {}
//%X-
}

//%%- ---- Start of the ovejumped text with closing of the envelope ----
////////////////////////////////////////////////////////////////////////////////
//== TESTING CLASSES AND METHODS ===============================================
//Není-li třída testovací, následující dvě metody se smažou


    /***************************************************************************
     * Třída, jejíž instance má na starosti úklid mezi jednotlivými testy,
     * který není možno zakomponovat do metody {@code tearDown()},
     * dokud nebudou studenti umět programovat.
     */
    private static class TearDown implements Run.ITD
    {
        /** {@inheritDoc} */
        @Override
        public void cleanUp()
        {
//            Canvas.clearCanvas();
//            CanvasManager.getInstance().removeAll();
        }
    }


    /***************************************************************************
     * Test method.
     */
    public static void test()
    {
        Run.tests(CarTest.class,
                new TearDown(),
//                "testFixture",
//                "testBlink",
//                "testPositionSize",
//                "testSmoothMovement",
//                "testSmoothlySwapPositions",
//                "testSwapPositionsWithCheck",
//                "testMobility",
                "testSortList",
                "");
        System.exit(0);
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main(String[] args)  {  test();  }
}
